package com.crowd.web.controller;

import com.crowd.entity.Menu;
import com.crowd.service.api.IMenuService;
import com.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Stone
 * @date 2020/5/21 13:48
 */
//@Controller
//@ResponseBody
// 如果一个Controller，里面的方法都是ResponseBody，那么可以把ResponseBody提到最上面。还有更简单的，就是用RestController代替这两个注解
@RestController
public class MenuController {
    @Autowired
    private IMenuService menuService;

    /**
     * @Author:Stone

       * @return: com.crowd.util.ResultEntity<com.crowd.entity.Menu>
     * @Date: 2020/5/21 13:53
     * @Description:拿到根节点=拿到整棵树
     * 思路：因为Menu的结构，我们可以做一个嵌套模型，
     *      root
     *          |-- branch
     *                  |-- leaves
     *  做法就是比较id和pid，把父子关系找出来，通过setChildren方法，把关系全部嵌套进去
     *  作比较的时候，必须需要一个temp变量，在这里 Map就是这个temp对象，拿来存放中间比较变量的
    */
    //    @ResponseBody
    @RequestMapping("menu/get/whole/tree")
    public ResultEntity<Menu> getWholeTree(){
        // 1.声明一个根节点
        Menu root = null;
        // 2.用menuService找到所有数据
        List<Menu> menuList = menuService.getAll();
        // 3.声明一个map对象，存放Map<menuid,menu>
        Map<Integer,Menu> menuMap = new HashMap<>();
        // 史诗级演示，怎么把List放在Map里面
        for (Menu menu:menuList){
            Integer menuId = menu.getId();
            menuMap.put(menuId, menu);
        }
        // 4.比较id和pid，把所有的数据放在一个root对象上
        for (Menu menu:menuList){
            Integer menuPid = menu.getPid();

            //如果id为空，跳出循环
            if(menuPid == null){
                root = menu;
                continue ;
            }

            // 比较，并且找爸爸
            // 儿子（pid）=爸爸（id），那么爸爸就收了儿子
            if(menuMap.containsKey(menuPid)){
                Menu father = menuMap.get(menuPid);
                father.getChildren().add(menu);
            }
        }

        return ResultEntity.successWithData(root);
    }

    /**
     * @Author:Stone
       * @Param menu:
       * @return: com.crowd.util.ResultEntity<java.lang.String>
     * @Date: 2020/5/22 17:17
     * @Description:保存数据
    */
    @RequestMapping("menu/save")
    //    @ResponseBody
    public ResultEntity<String> saveMenu(Menu menu){
        try {
            menuService.saveMenu(menu);
            return ResultEntity.successWithoutData();
        }catch (Exception e){
            return ResultEntity.failed(e.getMessage());
        }
    }

    /**
     * @Author:Stone
       * @Param menu:
       * @return: com.crowd.util.ResultEntity<java.lang.String>
     * @Date: 2020/5/22 17:58
     * @Description:更新数据
    */
    @RequestMapping("menu/update")
    //    @ResponseBody
    public ResultEntity<String> updateMenu(Menu menu){
        try {
            menuService.updateMenu(menu);
            return ResultEntity.successWithoutData();
        }catch (Exception e){
            return ResultEntity.failed(e.getMessage());
        }
    }


    /**
     * @Author:Stone
       * @Param menuId:
       * @return: com.crowd.util.ResultEntity<java.lang.String>
     * @Date: 2020/5/22 18:21
     * @Description: 删除数据
    */
    @RequestMapping("menu/remove")
    //    @ResponseBody
    public ResultEntity<String> removeMenu(@RequestParam(value = "menuId") Integer menuId){
        try{
            if(menuId == null){
                throw new NullPointerException();
            }
            menuService.removeMenu(menuId);
            return ResultEntity.successWithoutData();
        }catch (Exception e){
            return ResultEntity.failed(e.getMessage());
        }
    }
}
